package com.woniu.util;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.util.Base64URL;

import java.util.HashMap;
import java.util.Map;

/**
 * 生成JWT
 * 头部
 * 载荷
 * 签名
 */
public class JWTTest {
    public static void main(String[] args) throws JOSEException {
        Map map = new HashMap();
        map.put("userId","123");
        map.put("username","admin");
        String jwt = createJWT(map);
        System.out.println(jwt);
    }

    private static String createJWT(Map map) throws JOSEException {
        //生成头部：加密方式，常量
        JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.HS256)
                .type(JOSEObjectType.JWT).build();
        //把头部对象通过 base64 编码生成
//        Base64URL base64URL = jwsHeader.toBase64URL();
//        System.out.println(base64URL);

        //载荷部分：存放用户信息

        Payload payload = new Payload(map);
//        System.out.println(payload.toBase64URL());

        //签名部分：头部 + 载荷 + 加密（密钥）
        JWSObject jwsObject = new JWSObject(jwsHeader,payload);
        String key = "aosdjfaosi" +
                     "djfatjhvgv" +
                     "hgcgcgvhgvhg";   //At least 256 bits 32个字符就行
        MACSigner macSigner = new MACSigner(key);  //对称加密实现的一个类
        jwsObject.sign(macSigner);   //通过指定的加密方式加密

        String jwt = jwsObject.serialize(); //把签名对象序列化成字符串
        return jwt;
    }
}
